# -*- coding: UTF-8 -*-


# 关于read返回值的处理
# 1. odoo 原生字段m2m 和 o2m 空值时 返回 [], 其他类型的字段 返回 false
# 2. boolean 字段 返回 true / false 无需处理
# 3. 除了 m2m 和 o2m 和 boolean 的 其他类型字段。js 底层将空值处理为 null, 页面无需再处理
# 2. many2one 字段 页面返回 null 或 [id, name]
#    显示时做 空和非空判断，非空时显示 name
# 3. many2many 和 one2many 字段 返回 数组 [ids].
#    many2many 通常用 tags 显示, 用name_get 接口 再读一次具体的文本
#    one2many 通常用 table 显示, 用 read 接口, 再读一次.
# 4. binary 字段, 通常是 image 图片. 忽略该字段, 用其他放肆显示图片
#      若是 附件 文件. 用 file 上传下载 接口 处理
# 5. char 和 text 字符串/文本字段. 页面返回 null 或 '字符串'. 可直接用于显示和编辑
# 6. date 和 datetime 字段, 返回 null 或 'YYYY-MM-DD hh:mm:ss' 字符串
#     用  date 组件显示。 null 值时 可能需要做个转换处理
#
# 页面中 只读显示时, 直接 渲染
# 页面中 编辑时, 可以 用各种input组件渲染
#  编辑时
#    页面中定义变量 res_id 为 当前编辑的 记录 id, 若为新增, 则为 0
#    页面中定义三个变量 record, values_edit 和 values
#    record 用于编辑时，原始的数据
#    values_edit 用于  v-model绑定数据
#    values 用于 change事件触发后, 保存修改后的值
#    定义变量 edit_model 用于管理 onchange 和 commit 的 排队顺序执行
#      edit_model 需要初始化，参数为 res_id record values
#    每个字段编辑后触发  change 事件, 调用 edit_model.onchange
#    页面保存按钮点击后 调用 edit_model.commit事件
#    父组件中 组织数据, 调用 onchange 接口
#


from odoorpc import rpc


# 在 这里, 列出所有前端 需要的字段
fields = [
    'company_id',
    'sale_ok',
    'barcode',
    'name', 'display_name', 'categ_id'
]


model = 'product.template'


def test_product_fields_get():
    # 获取所有字段, 以及字段的类型
    Model = rpc.env.model(model)

    attributes = [
        'type',  # 类型
        'name',  # 字段名
        'string',  # 中文名
        'store',  # 在数据库中有存储
        'related',  # 通过其他m2o字段 关联到的字段
        'relation',  # 关联模型
        'relation_field',  # type=one2many 字段的 关联模型中的字段名
        'required',  # 必填
        'readonly',  # 只读
        'selection',  # type=selection 字段的 可选项
    ]
    res = Model.fields_get([], [])
    print('test_product_fields_get', res)


def test_product_search():
    # 产品列表
    Model = rpc.env.model(model, fields=fields)

    domain = []

    res = Model.search_read(domain=domain, fields=fields)
    print('test_product_search', res)

    # 返回结果中. 特殊字段的格式需要指明
    pass


def test_product_read():
    # 产品详情页面
    Model = rpc.env.model(model, fields=fields)

    domain = []
    products = Model.search_read(domain=domain, fields=fields)

    # 选择一条记录, 获得 id
    res_id = products[0]['id']

    ressult_list = Model.read(res_id, fields=fields)
    res = ressult_list[0]
    print('test_product_read', res)


def test_product_edit():
    # 产品编辑页面

    # 为异步函数, 从数据库读字段信息
    Model = rpc.env.model(model, fields=fields)

    # 定义变量, 暂存字段信息
    fields_info = Model._fields

    print('fields_info', fields_info)

    domain = []
    products = Model.search_read(domain=domain, fields=fields)

    # 选择一条记录, 获得 id
    res_id = products[0]['id']

    ressult_list = Model.read(res_id, fields=fields)

    # 定义变量 record, 暂存原始数据
    record = ressult_list[0]

    # 定义变量 values_edit 作为 form 表单渲染用
    values_edit = record
    print('test_product_edit, values_edit', values_edit)

    # 定义变量 values,  作为 编辑后的数据
    values = {}

    # 定义变量 values,  作为 编辑后的数据
    values = {}

    # 定义变量 edit_model, 管理编辑
    edit_model = Model.init_edit_model(res_id, record, values)

    # m2o 字段, categ_id, 获取下拉框 可选项 内容
    CategModel = rpc.env.model('product.category')
    CategModel = rpc.env.model(fields_info['categ_id']['relation'])
    categ_id_select_options = CategModel.name_search()
    print('test_product_edit, categ_id_select_options', categ_id_select_options)

    # 定义 change事件
    def handelChange(fname, value):
        # 回调函数
        def callback(result):
            values = result['values']
            # 更新 表单渲染
            print('change ok', values_edit, values)
            values_edit.update(values)
            print('change ok', values_edit, values)

        # 添加到 onchange 触发队列.
        edit_model.onchange(callback, fname, value)

    # 定义 commit事件
    def handelCommit():
        # 回调函数
        def callback2(res_id):
            # commit ok. 返回 id
            print('test_product_edit commit ok,', res_id)

            # 刷新页面, 读取数据
            res_read = Model.read(res_id, fields=fields)
            print('test_product_edit, res_read', res_read)

        # 添加到  触发队列.
        edit_model.commit(callback2)

    # 编辑名称. 触发 change 事件
    handelChange('name', '雪花啤酒300ML')

    print('test_product_edit, values_edit', values_edit)

    # 点击保存按钮, 提交修改
    handelCommit()


def test_product_create():
    # 产品新增页面
    Model = rpc.env.model(model, fields=fields)

    # 定义变量 value1. value2.
    value1 = {}
    value2 = {}

    # 调用 onchange 事件, 获取 默认值
    onchange_res = Model.onchange(
        [],
        {},
        None,
        {
            'name': '1',
            'display_name': '1',
            'categ_id': '1'
        }
    )

    # onchange 结果 更新到 value1 和 value2
    value1.update(onchange_res['value'])
    value2.update(onchange_res['value'])

    value1['categ_id'] = onchange_res['value']['categ_id'][0]
    value2['categ_id'] = onchange_res['value']['categ_id'][0]

    print('test_product_create, onchange default_get', onchange_res)

    # 编辑名称. 触发 change 事件
    value1['name'] = '燕京啤酒大瓶装1000L'
    value2['name'] = value1['name']

    # 触发 onchange 事件
    onchange_res = Model.onchange(
        [],
        {
            'name': value1['name'],
            'display_name': value1['display_name'],
            'categ_id': value1['categ_id']
        },
        'name',
        {
            'name': '1',
            'display_name': '1',
            'categ_id': '1'
        }
    )

    # onchange 结果 更新到 value1 和 value2
    value1.update(onchange_res['value'])
    value2.update(onchange_res['value'])

    print('test_product_create, onchange name', onchange_res)
    print('test_product_create, value1', value1)
    print('test_product_create, value2', value2)

    # 点击保存按钮, 提交新增
    res_id = Model.create(value2)
    print('test_product_create, res_id', res_id)

    # 刷新页面, 读取数据
    res_read = Model.read(res_id, fields=fields)
    print('test_product_create, res_read', res_read)


def test_product_delete():
    # 产品删除处理
    Model = rpc.env.model(model, fields=fields)

    domain = []
    products = Model.search_read(domain=domain, fields=fields)

    # 选择一条记录, 获得 id
    res_id = products[0]['id']

    print('test_product_delete, all', products)
    print('test_product_delete, res_id', res_id)

    res = Model.unlink(res_id)
    print('test_product_delete, delete result', res)

    products = Model.search_read(domain=domain, fields=fields)
    print('test_product_delete, re read all', products)
